#include "Documents.h"


Documents::Documents(string nombreArchivo)
{
	cargarDocumentos(nombreArchivo);
}


Documents::~Documents()
{
}


void Documents::setDocumento(string documento,unsigned int numDoc)
{
	docRank aux;
	aux.numeroDoc = numDoc;
	aux.docName = documento;
	aux.rank =0;
	docs.push_back(aux);
}

void Documents::setRank(unsigned int numDoc,double rank)
{
	docs[numDoc].rank=rank;
}

void Documents::cargarDocumentos(string nombreArchivo)
{
	 unsigned int cont =0;
	 string line;
	 ifstream myfile (nombreArchivo.c_str());

	 if (myfile.is_open())
	 {
	   while ( myfile.good() )
	   {
	     getline (myfile,line);
	     if(line !="")
	     {
	    	 setDocumento(line,cont);
	    	 cont++;
	     }
	   }
	   myfile.close();
	 }

}

void Documents::cargarRanks(vector<double> ranks)
{
  for(unsigned int i=0; i< ranks.size();i++)
  {
	  setRank(i,ranks[i]);
  }
}


void Documents::imprimirRanks(string pNombre,string order)
{

	fstream documentosOrdenados;
	documentosOrdenados.open (pNombre.c_str(),ios::out);
	int CantidadResultados=0;
	if (order=="asc")
	{
	  for(unsigned int i=0; i< docs.size();i++)
	  {
	    //printf("Documento: %s Rank: %f\n",docs[i].docName.c_str(),docs[i].rank);
	    //documentosOrdenados << "Documento: "<<docs[i].docName.c_str()<<" Rank: "<<docs[i].rank << endl;
		  documentosOrdenados << "Documento: "<<docs[i].docName.c_str()<< endl;
	    CantidadResultados++;
	    if (CantidadResultados>MaxResult)
	    	break;
	  }
	  //printf("Archivo: %s\n",pNombre.c_str());
	  documentosOrdenados.close();
	}
	else
	{
		  for(int i=docs.size()-1; i>=0;i--)
		  {
		    //printf("Documento: %s Rank: %f\n",docs[i].docName.c_str(),docs[i].rank);
		    //documentosOrdenados << "Documento: "<<docs[i].docName.c_str()<<" Rank: "<<docs[i].rank << endl;
			documentosOrdenados << "Documento: "<<docs[i].docName.c_str() << endl;
		    CantidadResultados++;
		    if (CantidadResultados>MaxResult)
		    	break;
		  }
		  //printf("Archivo: %s\n",pNombre.c_str());
		  documentosOrdenados.close();
	};
}

void Documents::imprimirRanksOrdenados(string pNombre)
{
	//ordenarDocuemntos(0,docs.size()-1);
	//imprimirRanks(pNombre,"desc");

	ordenarDocuemntosABS(0,docs.size()-1);
	imprimirRanks(pNombre,"desc");
}

void Documents::swapDocs(int left, int right)
{
	if((left>=0) && (right>=0))
	{
		docRank aux;

		aux.docName= docs[left].docName;
		aux.numeroDoc= docs[left].numeroDoc;
		aux.rank= docs[left].rank;

		docs[left].docName= docs[right].docName;
		docs[left].numeroDoc= docs[right].numeroDoc;
		docs[left].rank= docs[right].rank;

		docs[right].docName= aux.docName;
		docs[right].numeroDoc= aux.numeroDoc;
		docs[right].rank= aux.rank;
	}

}
void Documents::ordenarDocuemntos(int m,int n)
{


   if( m < n)
   {

   int j;
   int i;
   int k;
   double key;

   	   k = (m+n) /2;//choose_pivot(m,n);
   	swapDocs(m,k); //Muevo el Pibot al principio para q no interfiera con el ordenamiento

      key=docs[m].rank;

      i = m+1;
      j = n;

      while(i <= j)
      {
         //Ojo inverti los signos de la comparaicon de los Keys
    	 while((i <= n) && (docs[i].rank  <= key))
                 {i++;};
         while((j > m) && (docs[j].rank  >= key))
               {j--;};

         if( i < j)
         {
        	 swapDocs(i,j);

         }
      };

      swapDocs(m,j);
      ordenarDocuemntos(m,j-1);

      ordenarDocuemntos(j+1,n);
   }
}
   void Documents::ordenarDocuemntosABS(int m,int n)
   {


      if( m < n)
      {

      int j;
      int i;
      int k;
      double key;

      	   k = (m+n) /2;//choose_pivot(m,n);
      	swapDocs(m,k); //Muevo el Pibot al principio para q no interfiera con el ordenamiento

         key=abs(docs[m].rank);

         i = m+1;
         j = n;

         while(i <= j)
         {
            //Ojo inverti los signos de la comparaicon de los Keys
       	 while((i <= n) && (abs(docs[i].rank)  <= key))
                    {i++;};
            while((j > m) && (abs(docs[j].rank)  >= key))
                  {j--;};

            if( i < j)
            {
           	 swapDocs(i,j);

            }
         };

         swapDocs(m,j);
         ordenarDocuemntosABS(m,j-1);

         ordenarDocuemntosABS(j+1,n);
      }

   }


